/*     */ package com.zimbra.cs.mailclient.imap;
/*     */ 
/*     */ import java.io.IOException;
/*     */ import java.util.ArrayList;
/*     */ import java.util.Arrays;
/*     */ import java.util.Formatter;
/*     */ import java.util.HashMap;
/*     */ import java.util.List;
/*     */ import java.util.Map;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class BodyStructure
/*     */ {
/*     */   private String type;
/*     */   private String subtype;
/*     */   private Map<String, String> params;
/*     */   private String id;
/*     */   private String description;
/*     */   private String encoding;
/*  37 */   private long size = -1L;
/*  38 */   private long lines = -1L;
/*     */   
/*     */   private Envelope envelope;
/*     */   
/*     */   private BodyStructure[] parts;
/*     */   
/*     */   private String md5;
/*     */   
/*     */   private String disposition;
/*     */   
/*     */   private Map<String, String> dispositionParams;
/*     */   
/*     */   private String[] language;
/*     */   
/*     */   private String location;
/*     */   
/*     */   public static BodyStructure read(ImapInputStream is, boolean ext)
/*     */     throws IOException
/*     */   {
/*  57 */     BodyStructure bs = new BodyStructure();
/*  58 */     is.skipSpaces();
/*  59 */     is.skipChar('(');
/*  60 */     is.skipSpaces();
/*  61 */     if (is.peek() == 40) {
/*  62 */       bs.readMPart(is, ext);
/*     */     } else {
/*  64 */       bs.read1Part(is, ext);
/*     */     }
/*  66 */     is.skipSpaces();
/*  67 */     is.skipChar(')');
/*  68 */     return bs;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private void read1Part(ImapInputStream is, boolean ext)
/*     */     throws IOException
/*     */   {
/*  88 */     this.type = is.readString().toUpperCase();
/*  89 */     is.skipChar(' ');
/*  90 */     this.subtype = is.readString().toUpperCase();
/*  91 */     is.skipChar(' ');
/*  92 */     readFields(is);
/*  93 */     if (this.type.equals("TEXT")) {
/*  94 */       is.skipChar(' ');
/*  95 */       this.lines = is.readNumber();
/*  96 */     } else if ((this.type.equals("MESSAGE")) && (this.subtype.equals("RFC822"))) {
/*  97 */       is.skipChar(' ');
/*  98 */       this.envelope = Envelope.read(is);
/*  99 */       is.skipChar(' ');
/* 100 */       this.parts = new BodyStructure[] { read(is, ext) };
/* 101 */       is.skipChar(' ');
/* 102 */       this.lines = is.readNumber();
/*     */     }
/* 104 */     if ((ext) && (is.match(' '))) {
/* 105 */       this.md5 = is.readNString();
/* 106 */       if (is.match(' ')) { readExt(is);
/*     */       }
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   private void readMPart(ImapInputStream is, boolean ext)
/*     */     throws IOException
/*     */   {
/* 116 */     this.type = "MULTIPART";
/* 117 */     List<BodyStructure> parts = new ArrayList();
/* 118 */     while (is.peekChar() == '(') {
/* 119 */       parts.add(read(is, ext));
/* 120 */       is.skipSpaces();
/*     */     }
/* 122 */     this.subtype = is.readString().toUpperCase();
/* 123 */     if ((ext) && (is.match(' '))) {
/* 124 */       this.params = readParams(is);
/* 125 */       if (is.match(' ')) {
/* 126 */         is.skipSpaces();
/* 127 */         readExt(is);
/*     */       }
/*     */     }
/* 130 */     this.parts = ((BodyStructure[])parts.toArray(new BodyStructure[parts.size()]));
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   private void readExt(ImapInputStream is)
/*     */     throws IOException
/*     */   {
/* 139 */     is.skipSpaces();
/* 140 */     if (is.match('(')) {
/* 141 */       this.disposition = is.readString();
/* 142 */       is.skipChar(' ');
/* 143 */       is.skipSpaces();
/* 144 */       this.dispositionParams = readParams(is);
/* 145 */       is.skipSpaces();
/* 146 */       is.skipChar(')');
/*     */     } else {
/* 148 */       is.skipNil();
/*     */     }
/* 150 */     if (is.match(' ')) {
/* 151 */       is.skipSpaces();
/* 152 */       this.language = readLang(is);
/* 153 */       if (is.match(' ')) {
/* 154 */         this.location = is.readNString();
/* 155 */         while (is.match(' ')) {
/* 156 */           skipExtData(is);
/*     */         }
/*     */       }
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private void readFields(ImapInputStream is)
/*     */     throws IOException
/*     */   {
/* 171 */     this.params = readParams(is);
/* 172 */     is.skipChar(' ');
/* 173 */     this.id = is.readNString();
/* 174 */     is.skipChar(' ');
/* 175 */     this.description = is.readNString();
/* 176 */     is.skipChar(' ');
/* 177 */     this.encoding = is.readString();
/* 178 */     is.skipChar(' ');
/* 179 */     this.size = is.readNumber();
/*     */   }
/*     */   
/*     */   private static Map<String, String> readParams(ImapInputStream is)
/*     */     throws IOException
/*     */   {
/* 185 */     is.skipSpaces();
/* 186 */     if (!is.match('(')) {
/* 187 */       is.skipNil();
/* 188 */       return null;
/*     */     }
/* 190 */     HashMap<String, String> params = new HashMap();
/* 191 */     is.skipSpaces();
/* 192 */     while (!is.match(')')) {
/* 193 */       String name = is.readString().toLowerCase();
/* 194 */       is.skipChar(' ');
/* 195 */       String value = is.readString();
/* 196 */       params.put(name, value);
/*     */     }
/* 198 */     return params;
/*     */   }
/*     */   
/*     */ 
/*     */   private static void skipExtData(ImapInputStream is)
/*     */     throws IOException
/*     */   {
/* 205 */     if (is.match('(')) {
/* 206 */       is.skipSpaces();
/* 207 */       while (!is.match(')')) {
/* 208 */         skipExtData(is);
/* 209 */         is.skipSpaces();
/*     */       }
/*     */     }
/* 212 */     is.readAStringData();
/*     */   }
/*     */   
/*     */ 
/*     */   private static String[] readLang(ImapInputStream is)
/*     */     throws IOException
/*     */   {
/* 219 */     if (is.peek() != 40) {
/* 220 */       String lang = is.readNString();
/* 221 */       return lang != null ? new String[] { lang } : null;
/*     */     }
/* 223 */     is.skipChar('(');
/* 224 */     ArrayList<String> lang = new ArrayList();
/* 225 */     is.skipSpaces();
/* 226 */     while (!is.match(')')) {
/* 227 */       lang.add(is.readString());
/* 228 */       is.skipSpaces();
/*     */     }
/* 230 */     return (String[])lang.toArray(new String[lang.size()]);
/*     */   }
/*     */   
/* 233 */   public String getType() { return this.type; }
/* 234 */   public String getSubtype() { return this.subtype; }
/* 235 */   public Map<String, String> getParameters() { return this.params; }
/* 236 */   public String getId() { return this.id; }
/* 237 */   public String getDescription() { return this.description; }
/* 238 */   public String getEncoding() { return this.encoding; }
/* 239 */   public long getSize() { return this.size; }
/* 240 */   public long getLines() { return this.lines; }
/* 241 */   public Envelope getEnvelope() { return this.envelope; }
/* 242 */   public BodyStructure[] getParts() { return this.parts; }
/* 243 */   public String getMd5() { return this.md5; }
/* 244 */   public String[] getLanguage() { return this.language; }
/* 245 */   public String getLocation() { return this.location; }
/* 246 */   public String getDisposition() { return this.disposition; }
/*     */   
/* 248 */   public Map<String, String> getDispositionParameters() { return this.dispositionParams; }
/*     */   
/*     */   public boolean isMultipart() {
/* 251 */     return "MULTIPART".equals(this.type);
/*     */   }
/*     */   
/*     */   public String toString() {
/* 255 */     Formatter fmt = new Formatter();
/* 256 */     toString(fmt, 0, 0);
/* 257 */     return fmt.toString();
/*     */   }
/*     */   
/*     */   private void toString(Formatter fmt, int depth, int count) {
/* 261 */     fmt.format("%s%d: type=%s/%s encoding=%s disposition=%s", new Object[] { spaces(depth), Integer.valueOf(count), this.type, this.subtype, this.encoding, this.disposition });
/*     */     
/* 263 */     if (this.parts != null) {
/* 264 */       fmt.format(" count=%d\n", new Object[] { Integer.valueOf(this.parts.length) });
/* 265 */       for (int i = 0; i < this.parts.length; i++) {
/* 266 */         toString(fmt, depth + 1, i);
/*     */       }
/*     */     } else {
/* 269 */       fmt.format(" size=%d\n", new Object[] { Long.valueOf(this.size) });
/*     */     }
/*     */   }
/*     */   
/*     */   private String spaces(int depth) {
/* 274 */     char[] spaces = new char[depth * 4];
/* 275 */     Arrays.fill(spaces, ' ');
/* 276 */     return new String(spaces);
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/mailclient/imap/BodyStructure.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */